addFromPstnCustomContext
должна добавить контекст

[from-pstn-custom]
exten => _.,1,NoOp()
exten => _.,n,ExecIf($["${CALLERID(num):0:1}" = "0"]?Set(CALLERID(num)=+375${CALLERID(num):1}))
exten => _.,n,ExecIf($["${CALLERID(num):0:2}" = "80"]?Set(CALLERID(num)=+375${CALLERID(num):2}))
exten => _.,n,ExecIf($["${CALLERID(num):0:1}" = "8"]?Set(CALLERID(num)=+375${CALLERID(num):1}))
exten => _.,n,GosubIf($["${CALLERID(num)}" = "Unknown"]?zamena-bx24,${EXTEN},1)
exten => _.,n,GosubIf($["${CALLERID(num)}" = "UNKNOWN"]?zamena-bx24,${EXTEN},1)
exten => _.,n,GosubIf($["${CALLERID(num)}" = "anonymous"]?zamena-bx24,${EXTEN},1)
exten => _.,n,Set(numdig=${LEN(${CALLERID(num)})})
exten => _.,n,GosubIf($["${numdig}" = "7"]?numberadddigit-bx24,${EXTEN},1)
exten => _.,n,Set(CALLERID(number)=${CALLERID(num)})
exten => _.,n,Set(CALLERID(all)=${CALLERID(num)})
exten => _.,n,Set(CALLERID(name)=${CALLERID(num)})
exten => _.,n,Set(__clientnum=${CALLERID(num)})
exten => _.,n,Set(__calldirection=in)
exten => _.,n,AGI(accountuniqe.sh)
exten => _.,n,Set(CHANNEL(accountcode)=${bashres})
exten => _.,n,Set(DB(${EXTEN}/${clientnum}/account)=${CHANNEL(accountcode)})
exten => _.,n,Set(CHANNEL(hangup_handler_push)=in-call-end-bx24,s,1)
exten => _.,n(ats2bx24-incall),ExecIf($["${DB(zruchna/outcrm/${CALLERID(num)})}" = "" & "${ZRUCHNA_CLIENT_NAME}" != ""]?System(klient="${ZRUCHNA_CLIENT_NAME}" /bin/bash '/var/www/html/admin/modules/zruchnaio/bin/inbound.sh' "${CHANNEL(LINKEDID)}" "${EXTEN}" "${CALLERID(num)}" "${STRFTIME(${EPOCH},,%d-%m-%Y %H:%M:%S)}" "${CHANNEL(accountcode)}" &))
exten => _.,n,Set(DB(${EXTEN}/${clientnum}/queuecount)=0)
exten => _.,n,Set(__startcdrnew=${STRFTIME(${EPOCH},UTC+0,%Y-%m-%d %H:%M:%S)})
exten => _.,n,Set(__CallinStart=${STRFTIME(epoch,,%s)})
exten => _.,n,Goto(,${EXTEN},1)

exten => h,1,NoOp()
exten => h,n,Hangup()


addNewExtDidContext
должна добавить контекст

[new-ext-did-bx24]
include => ext-did
include => ext-did-post-custom
include => from-did-direct
include => ext-did-catchall


addNumberadddigitContext
должна добавить контекст
[numberadddigit-bx24]
exten => _.,1,Set(CALLERID(num)=+37517${CALLERID(num)})
exten => _.,n,Return()


addZamenaContext
должна добавить контекст
[zamena-bx24]
exten => _.,1,Set(CALLERID(num)=+999999999999)
exten => _.,n,Set(CALLERID(all)=${CALLERID(num)})
exten => _.,n,Set(CALLERID(name)=${CALLERID(all)})
exten => _.,n,Return()


addMisscallContext
должна добавить контекст
[misscall-bx24]
exten => s,1,NoOp()
exten => s,n,Set(CallStop=${STRFTIME(epoch,,%s)})
exten => s,n,Set(timecalldur=${MATH(${CallStop}-${CallinStart},int)})
exten => s,n,ExecIf($["${timecalldur}" = "0"]?Set(timecalldur=1))
exten => s,n(ats2bx24-misscall),ExecIf($["${ZRUCHNA_CLIENT_NAME}" != ""]?System(klient="${ZRUCHNA_CLIENT_NAME}" /bin/bash '/var/www/html/admin/modules/zruchnaio/bin/miss.sh' "${CALLERID(num)}" "${FROM_DID}" "${DB(${FROM_DID}/${CALLERID(num)}/dstnum)}" "${ANSWEREDTIME}" "${DIALSTATUS}" "NoFile" "${UNIQUEID}" "${CHANNEL(accountcode)}" "${timecalldur}" &))
exten => s,n,Gosub(misscall-dbdel-bx24,s,1)
exten => s,n,Set(CDR(userfield)=miss_call)
exten => s,n,Return()



addMisscalldbdelContext
должна добавить контекст
[misscall-dbdel-bx24]
exten => s,1,NoOp()
exten => s,n,NoOp(${DB_DELETE(${FROM_DID}/${CALLERID(num)}/num)})
exten => s,n,NoOp(${DB_DELETE(${FROM_DID}/${CALLERID(num)}/account)})
exten => s,n,NoOp(${DB_DELETE(${FROM_DID}/${CALLERID(num)}/queuecount)})
exten => s,n,NoOp(${DB_DELETE(${FROM_DID}/${CALLERID(num)}/queue)})
exten => s,n,NoOp(${DB_DELETE(${FROM_DID}/${CALLERID(num)}/dstnum)})
exten => s,n,NoOp(${DB_DELETE(${MEMBERNAME}/outtotransfer)})
exten => s,n,NoOp(${DB_DELETE(${MEMBERNAME}/outtotransfermiss)})
exten => s,n,Return()


addMacroOutdialContext
должна добавить контекст
[outdialanswer-bx24]
exten => s,1,NoOp()
exten => s,n,NoOp(${CALLERIDNUMINTERNAL})
exten => s,n,ExecIf($["${CHANNEL(accountcode):0:3}" != "ATS"]?Set(DB(out/${CALLERIDNUMINTERNAL}/${numbclient}/startcdranswer)=${STRFTIME(epoch,,%s)}))
exten => s,n(ats2bx24-outcall-answ),ExecIf($["${ZRUCHNA_CLIENT_NAME}" != ""]?System(klient="${ZRUCHNA_CLIENT_NAME}" /bin/bash '/var/www/html/admin/modules/zruchnaio/bin/outanswer.sh' "${CHANNEL(LINKEDID)}" "${CONNECTEDLINE(num)}" "${CALLERID(num)}" "${CDR(start)}" "${CHANNEL(accountcode)}" &))
exten => s,n,Return()

addCallanswerContext убираем
addCallansweContext убираем


addInCallEndContext
должна добавить контекст
[in-call-end-bx24]
exten => s,1,NoOp()
exten => s,n,GosubIf($["${DB(${FROM_DID}/${CALLERID(num)}/num)}" = "" & "${todial}" = "" & "${DB(${CUT(CUT(MEMBERINTERFACE,/,2),@,1)}/outtotransfer)}" = ""]?misscall-bx24,s,1)
exten => s,n,Set(CallStop=${STRFTIME(epoch,,%s)})
exten => s,n,Set(innumber=${DB(${FROM_DID}/${CALLERID(num)}/num)})
exten => s,n,Set(CallStart=${DB(${FROM_DID}/${CALLERID(num)}/num/callstart)})
exten => s,n,Set(timecall=${MATH(${CallStop}-${CallStart},int)})
exten => s,n,Set(timecalldur=${MATH(${CallStop}-${CallinStart},int)})
exten => s,n,Set(memrealnum=${CUT(CUT(MEMBERINTERFACE,/,2),@,1)})
exten => s,n,ExecIf($["${ringbackexten:0:4}" = "FMPR"]?Set(memrealnum=${CONNECTEDLINE(num)}))
exten => s,n,NoOp(${memrealnum})
exten => s,n,ExecIf($["${memrealnum}" != "" & "${DB(${FROM_DID}/${CALLERID(num)}/totransfer-queue)}" = "" & "${innumber}" != "" & "${DB(${FROM_DID}/${CALLERID(num)}/blindt)}" != "yes" & "${BLKVM_CHANNEL}" = ""]?Set(__innumber=${memrealnum}))
exten => s,n(send),ExecIf($["${innumber}" != "" & "${ZRUCHNA_CLIENT_NAME}" != ""]?System(klient="${ZRUCHNA_CLIENT_NAME}" /bin/bash '/var/www/html/admin/modules/zruchnaio/bin/hangup.sh' "${CALLERID(num)}" "${FROM_DID}" "${innumber}" "${timecall}" "ANSWERED" "/var/spool/asterisk/monitor/${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${ZRUCHNA_FORMAT_RECORD}" "${CHANNEL(LINKEDID)}" "${DB(${FROM_DID}/${CALLERID(num)}/account)}" &))
exten => s,n,GosubIf($["${innumber}" != ""]?in-call-end-dbdel-bx24,s,1)

exten => s,n,NoOp()
exten => s,n,Return()

addInCallEndDbdelContext
должна добавить контекст
[in-call-end-dbdel-bx24]
exten => s,1,NoOp()
exten => s,n,NoOp(${DB_DELETE(${FROM_DID}/${CALLERID(num)}/num/callstart)})
exten => s,n,NoOp(${DB_DELETE(${FROM_DID}/${CALLERID(num)}/account)})
exten => s,n,NoOp(${DB_DELETE(${FROM_DID}/${CALLERID(num)}/queuecount)})
exten => s,n,NoOp(${DB_DELETE(${FROM_DID}/${CALLERID(num)}/num)})
exten => s,n,NoOp(${DB_DELETE(${FROM_DID}/${CALLERID(num)}/dstnum)})
exten => s,n,NoOp(${DB_DELETE(${FROM_DID}/${CALLERID(num)}/queue)})
exten => s,n,NoOp(${DB_DELETE(${MEMBERNAME}/outtotransfer)})
exten => s,n,NoOp(${DB_DELETE(${MEMBERNAME}/outtotransfermiss)})
exten => s,n,Return()


addOutnewCdr убираем

modifyMacroAutoBlkvmContext
вносит изменения в контекст
[macro-auto-blkvm]

после строки
exten => s,n,Set(MASTER_CHANNEL(FORWARD_CONTEXT)=from-internal)
добавить строку
exten => s,n,Gosub(in-call-answer-bx24,s,1)

создаём новый контекст
[in-call-answer-bx24]
exten => s,1,NoOp()
exten => s,n,Set(CallStart=${DB(${FROM_DID}/${CALLERID(num)}/num/callstart)})
exten => s,n,ExecIf($["${CallStart}" = ""]?Set(DB(${FROM_DID}/${clientnum}/num/callstart)=${STRFTIME(epoch,,%s)}))
exten => s,n,Set(numb=${DB(DEVICE/${CALLERID(num)}/user)})
exten => s,n,ExecIf($["${CallStart}" = "" & "${FMGRP}" != ""]?Set(numb=${FMGRP}))
exten => s,n,Set(DB(${FROM_DID}/${clientnum}/num)=${numb})
exten => s,n,Set(AC=${DB(${FROM_DID}/${clientnum}/account)})
exten => s,n,ExecIf($["${AC}"=""]?Set(AC=${variac}))
exten => s,n(ats2bx24-answer),ExecIf($["${ZRUCHNA_CLIENT_NAME}" != ""]?System(klient="${ZRUCHNA_CLIENT_NAME}" /bin/bash '/var/www/html/admin/modules/zruchnaio/bin/answer.sh' "${CHANNEL(LINKEDID)}" "${FROM_DID}" "${numb}" "${clientnum}" "${STRFTIME(${EPOCH},,%d-%m-%Y %H:%M:%S)}" "${AC}" &))
exten => s,n,Return()




добавлем новую функцию
addOuthangupContext
добавляет контекст
[outhangup-bx24]
exten => s,1,NoOp()
exten => s,n,Set(pjsipstatus=${CUT(CDR(dstchannel),/,1)})
exten => s,n,Set(CallStop=${STRFTIME(epoch,,%s)})
exten => s,n,ExecIf($["${FROMEXTEN:0:1}" = "1"]?Set(_AMPUSERCID=${FROMEXTEN}))
exten => s,n,Set(__statusdial=${CDR(disposition)})
exten => s,n,ExecIf($["${numbclient}" = ""]?Set(__numbclient=${CALLERID(num)}))
exten => s,n,ExecIf($["${statusdial}" = "ANSWERED" & "${DB(out/${AMPUSERCID}/${numbclient}/startcdranswer)}" = "" & "${NODEST}" = ""]?Set(__statusdial=NO ANSWER))
exten => s,n,ExecIf($["${DIALSTATUS}" = "BUSY"]?Set(__statusdial=BUSY))
exten => s,n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Set(__statusdial=ANSWERED))
exten => s,n,Set(startcdranswer=${DB(out/${AMPUSERCID}/${numbclient}/startcdranswer)})
exten => s,n,Set(destinationame=${DB(cidname/${numbclient})})
exten => s,n,Set(billsec=0)
exten => s,n,ExecIf($["${calldirection}" = "out" & "${CUT(CUT(post_num,@,2),/,1)}" = "" & "${trunkname}" = ""]?Set(__trunkname=${CUT(CUT(CDR(dstchannel),/,2),-,1)}))
exten => s,n,ExecIf($["${calldirection}" = "out" & "${CUT(CUT(post_num,@,2),/,1)}" = "" & "${trunkname}" = "" & "${pjsipstatus}" != "PJSIP"]?Set(__trunkname=${CUT(custom,/,2)}))
exten => s,n,ExecIf($["${calldirection}" = "out" & "${CUT(CUT(post_num,@,2),/,1)}" != "" & "${trunkname}" = "" & "${pjsipstatus}" != "PJSIP"]?Set(__trunkname=${CUT(CUT(post_num,@,2),/,1)}))
exten => s,n,ExecIf($["${calldirection}" = "out" & "${CUT(CUT(post_num,@,2),/,1)}" = "" & "${totransfer}" != ""]?Set(__trunkname=${CUT(ringbackexten,/,1)}))
exten => s,n,ExecIf($["${startcdranswer}" != ""]?Set(billsec=${MATH(${CallStop}-${startcdranswer},int)}))
exten => s,n,NoOp(${trunkname})
exten => s,n(ats2bx24-hangup),ExecIf($["${trunkname}" != "" & "${AMPUSERCID}" != "${trunkname}" & "${ZRUCHNA_CLIENT_NAME}" != "" & "${startcdrout}" != ""]?System(klient="${ZRUCHNA_CLIENT_NAME}" /bin/bash '/var/www/html/admin/modules/zruchnaio/bin/hangup2.sh' "${numbclient}" "${trunkname}" "${AMPUSERCID}" "${billsec}" "${statusdial}" "/var/spool/asterisk/monitor/${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${ZRUCHNA_FORMAT_RECORD}" "${UNIQUEID}" "${CHANNEL(accountcode)}" &))
exten => s,n,NoOp(${DB_DELETE(out/${AMPUSERCID}/${numbclient}/startcdranswer)})
exten => s,n,Return()



modifyMacroHangupcallContext
вносит изменения в контекст
[macro-hangupcall]
перед строкой

exten => s,n(hangup),Hangup()

добавить
exten => s,n,GoSubIf($["${calldirection}" = "out"]?outhangup-bx24,s,1)


modifyMacroDialoutTrunk
вносит изменения в контекст
[macro-dialout-trunk]

после строки
exten => s,1,Set(DIAL_TRUNK=${ARG1})
добавляем блок


exten => s,n,AGI(accountuniqeout.sh)
exten => s,n,Set(__calldirection=out)
exten => s,n,Set(__accountcode=${CHANNEL(accountcode)})
exten => s,n,ExecIf($["${CHANNEL(accountcode)}" = ""]?Set(CHANNEL(accountcode)=${accoutout}))
exten => s,n,Set(__startcdrout=${STRFTIME(epoch,,%s)})

перед строкой
exten => s,n,GotoIf($["${custom}" = "AMP"]?customtrunk)

добавляем блок
exten => s,n,Set(__numbclient=${FILTER(+0123456789,${CONNECTEDLINE(num)})})
exten => s,n,ExecIf($["${numbclient:0:3}" = "375"]?Set(__numbclient=+375${numbclient:3}))
exten => s,n,ExecIf($["${numbclient:0:2}" = "80"]?Set(__numbclient=+375${numbclient:2}))
exten => s,n,ExecIf($["${numbclient:0:2}" = "00"]?Set(__numbclient=+375${numbclient:2}))
exten => s,n,ExecIf($["${numbclient:0:1}" = "7"]?Set(__numbclient=+7${numbclient:1}))
exten => s,n,ExecIf($["${ZRUCHNA_CLIENT_NAME}" != "" & "${FMGL_DIAL}" = ""]?System(klient="${ZRUCHNA_CLIENT_NAME}" /bin/bash '/var/www/html/admin/modules/zruchnaio/bin/outdial.sh' "${CHANNEL(LINKEDID)}" "${numbclient}" "${AMPUSERCID}" "${CDR(start)}" "${CHANNEL(accountcode)}" &))

после строки
exten => s,n(outnum),Set(the_num=${OUTNUM})
добавляем
exten => s,n(skipoutnum),ExecIf($["${ZRUCHNA_CLIENT_NAME}" != "" & "${FMGL_DIAL}" = ""]?System(klient="${ZRUCHNA_CLIENT_NAME}" /bin/bash '/var/www/html/admin/modules/zruchnaio/bin/outdial.sh' "${CHANNEL(LINKEDID)}" "${numbclient}" "${AMPUSERCID}" "${CDR(start)}" "${CHANNEL(accountcode)}" &))


modifyMacroDialOneContext
вносит изменения в контекст
[dialOne-with-exten]
после строки 
exten => _[+-X].,1,Set(CHANNEL(hangup_handler_push)=app-missedcall-hangup,${DialMCEXT},1)
добавляем блок

exten => _[+-X].,n,ExecIf($["${DB(${FROM_DID}/${CALLERID(num)}/queue)}" = ""]?Set(DB(${FROM_DID}/${CALLERID(num)}/queue)=${NODEST}))
exten => _[+-X].,n,ExecIf($["${DB(${FROM_DID}/${CALLERID(num)}/queue)}" != "${NODEST}"]?Set(DB(${FROM_DID}/${CALLERID(num)}/queuecount)=0))
exten => _[+-X].,n,ExecIf($["${DB(${FROM_DID}/${CALLERID(num)}/queue)}" != "${NODEST}"]?Set(DB(${FROM_DID}/${CALLERID(num)}/queue)=${NODEST}))
exten => _[+-X].,n,Set(ringallstrat=NO)
exten => _[+-X].,n,NoOp(${DB(${FROM_DID}/${CALLERID(num)}/queuecount)})
exten => _[+-X].,n,Set(strat=${SHELL(asterisk -rx 'queue show ${NODEST}' | grep ringall | awk '{print$1}' | tr -d '\r\n')})
exten => _[+-X].,n,ExecIf($["${strat}" = "${NODEST}"]?Set(ringallstrat=YES))
exten => _[+-X].,n,NoOp("${strat}" = "${NODEST}")
exten => _[+-X].,n,ExecIf($["${ringallstrat}" = "YES"]?Set(dstext=${FILTER(0123456789,,${QUEUE_MEMBER_LIST(${NODEST})})}))
exten => _[+-X].,n,ExecIf($["${ringallstrat}" != "YES"]?Set(memcount=${QUEUE_MEMBER_COUNT(${NODEST})}))
exten => _[+-X].,n,NoOp(${FROMQ} ${AGENT_DEST} FROMQ=${FROMQ} strategy=${ringallstart} Nodest=${NODEST} Members=${QUEUE_MEMBER_LIST(${NODEST})} Members2=${FILTER(,0123456789,${QUEUE_MEMBER_LIST(${NODEST})})} membercount=${QUEUE_MEMBER_COUNT(${NODEST})})
exten => _[+-X].,n,ExecIf($["${clientnum}" != "" & "${dstext}" != "" & "${DB(${FROM_DID}/${CALLERID(num)}/queuecount)}" < 1 & "${FMGL_DIAL}" = ""]?System(klient="${ZRUCHNA_CLIENT_NAME}" /bin/bash '/var/www/html/admin/modules/zruchnaio/bin/queue.sh' "${CHANNEL(LINKEDID)}" "${clientnum}" "${STRFTIME(${EPOCH},,%d-%m-%Y%H:%M:%S)}" "${CHANNEL(accountcode)}" "${dstext}" &))
exten => _[+-X].,n,ExecIf($["${clientnum}" != "" & "${dstext}" != "" ]?Set(DB(${FROM_DID}/${CALLERID(num)}/queuecount)=${MATH(${DB(${FROM_DID}/${CALLERID(num)}/queuecount)}+1,int)}))
exten => _[+-X].,n,NoOp(${DB(${FROM_DID}/${CALLERID(num)}/queuecount)})
exten => _[+-X].,n,ExecIf($["${clientnum}" != "" & "${dstext}" = "" & ${DB(${FROM_DID}/${CALLERID(num)}/queuecount)} < ${memcount}]?Set(DB(${FROM_DID}/${CALLERID(num)}/queuecount)=${MATH(${DB(${FROM_DID}/${CALLERID(num)}/queuecount)}+1,int)}))
exten => _[+-X].,n,NoOp(${DB(${FROM_DID}/${CALLERID(num)}/queuecount)})
exten => _[+-X].,n,ExecIf($["${clientnum}" != "" & "${dstext}" = "" & "${ringallstrat}" != "YES" & "${memcount}" = "" & "${DB(${FROM_DID}/${CALLERID(num)}/queuecount)}" < 1 & "${FMGL_DIAL}" = ""]?System(klient="${ZRUCHNA_CLIENT_NAME}" /bin/bash '/var/www/html/admin/modules/zruchnaio/bin/queue.sh' "${CHANNEL(LINKEDID)}" "${clientnum}" "${STRFTIME(${EPOCH},,%d-%m-%Y%H:%M:%S)}" "${CHANNEL(accountcode)}" "${ARG3}" &))
exten => _[+-X].,n,ExecIf($["${clientnum}" != "" & "${dstext}" = "" & "${ringallstrat}" != "YES" & "${memcount}" = ""]?Set(DB(${FROM_DID}/${CALLERID(num)}/queuecount)=${MATH(${DB(${FROM_DID}/${CALLERID(num)}/queuecount)}+1,int)}))
exten => _[+-X].,n,NoOp(${DB(${FROM_DID}/${CALLERID(num)}/queuecount)})
exten => _[+-X].,n,NoOp(${LEN(${CALLERID(num)})})
exten => _[+-X].,n,Set(DB(${FROM_DID}/${CALLERID(num)}/dstnum)=${ARG3})
exten => _[+-X].,n,ExecIf($["${calldirection}" != "out" & "${totransfer}" != ""]?Set(DB(${FROM_DID}/${CALLERID(num)}/dstnum)=${totransfer}))

modifyMacroDialContext
вносит изменения в контекст
[macro-dial]
после строки
exten => s,n,NoOp(Working with ${EXTTOCALL})

добавляем блок
exten => s,n,ExecIf($["${clientnum}" != "" & "${dstext}" = "" & "${CUT(ARG3,-,2)}" = ""]?Set(innubdial=${ARG3}))
exten => s,n,ExecIf($["${clientnum}" != "" & "${dstext}" = "" & "${CUT(ARG3,-,2)}" != ""]?Set(innubdial=${CUT(ARG3,-,1)}))
exten => s,n,ExecIf($["${clientnum}" != "" & "${dstext}" = "" & "${ZRUCHNA_CLIENT_NAME}" != "" & "${FMGL_DIAL}" = ""]?System(klient="${ZRUCHNA_CLIENT_NAME}" /bin/bash '/var/www/html/admin/modules/zruchnaio/bin/queue.sh' "${CHANNEL(LINKEDID)}" "${clientnum}" "${STRFTIME(${EPOCH},,%d-%m-%Y%H:%M:%S)}" "${CHANNEL(accountcode)}" "${ARG3}" &))
exten => s,n,ExecIf($["${clientnum}" != "" & "${dstext}" = ""]?Set(DB(${FROM_DID}/${CALLERID(num)}/dstnum)=${innubdial}))
